﻿using UnityEngine;
using System.Collections;
using System;

public class RecieaveInputObject : ObjectBase
{
    // 터치 관련 변수
    [HideInInspector]
    public Camera m_Cam = null;
    protected GameObject m_PretouchOBJ = null;   // 터치 시작 끝 같은 오브젝트일때
    protected Vector2 m_SaveTouchDown;    // 드래그 판단에 쓰일 마우스 포지션 저장 변수
    protected float m_DragGap = 10.0f;   // 드래그인지 아닌지 판단하는 포지션 차이 
    [HideInInspector]
    public static bool s_IsAbleControl = true;    // 전체적인 컨트롤 관리
    public static bool IsAbleControl
    {
        get { return s_IsAbleControl; }
        set { s_IsAbleControl = value;
            Debug.Log("IsAbleControl = " + s_IsAbleControl);
        }
    }
    public bool isAbleTouch = true;              // 개별 컨트롤 관리
    protected bool m_IsDrag = false;

    void Awake()
    {
        AwakeObject();
    }

    void Start()
    {
        StartObject();
    }

    void Update()
    {
        if (IsAbleControl && isAbleTouch && !PopupManager.IsPopupExist)  // 터치 받을지 말지
            UpdateTouch();
        UpdateObject();
    }

    public virtual void UpdateTouch()       // 터치 입력 받는 함수. ButtonTouch 외에 다른 작업할경우 오버라이드해서 구현 사용
    {
#if UNITY_EDITOR
        if (Input.GetMouseButtonDown(0))
#else
        if (Input.touches.Length > 0 && Input.touches[0].phase == TouchPhase.Began)
#endif
        {
            Ray ray;
            RaycastHit rayHit;

            ray = m_Cam.ScreenPointToRay(Input.mousePosition);

            m_IsDrag = false;
            m_PretouchOBJ = null;

            if (Raycast(ray, out rayHit))
            {
                m_PretouchOBJ = rayHit.collider.gameObject;              
            }

            m_SaveTouchDown.Set(Input.mousePosition.x, Input.mousePosition.y);
        }

#if UNITY_EDITOR
        if (Input.GetMouseButton(0))
#else
        if (Input.touches.Length > 0 && Input.touches[0].phase == TouchPhase.Moved)
#endif        
        {
            if (!m_IsDrag)
            {
                if (System.Math.Abs(Input.mousePosition.x - m_SaveTouchDown.x) > m_DragGap
                    || System.Math.Abs(Input.mousePosition.y - m_SaveTouchDown.y) > m_DragGap)
                {
                    m_IsDrag = true;
                }
                else
                {
                    m_IsDrag = false;
                }
            }
        }
#if UNITY_EDITOR
        if (Input.GetMouseButtonUp(0))
#else
        if (Input.touches.Length > 0 && (Input.touches[0].phase == TouchPhase.Canceled || Input.touches[0].phase == TouchPhase.Ended))
#endif    
        {
            Ray ray;
            RaycastHit rayHit;

            ray = m_Cam.ScreenPointToRay(Input.mousePosition);          

            if (Raycast(ray, out rayHit))
            {
                if (m_PretouchOBJ != rayHit.collider.gameObject)
                    return;
            }

            if (!m_IsDrag && rayHit.collider != null)
            {
                ButtonTouch(rayHit.collider);
            }

            m_IsDrag = false;
            m_PretouchOBJ = null;

        }
    }

    public virtual void AwakeObject()  // awake
    {
    }

    public virtual void StartObject()  // start
    {
    }

    public virtual void UpdateObject()  // 버튼 터치 (터치 시작 끝 같은 오브젝트일때 터치 끝 시점에 호출)
    {
    }

    public virtual void ButtonTouch(Collider collider)  // 버튼 터치 (터치 시작 끝 같은 오브젝트일때 터치 끝 시점에 호출)
    {     
    }
}
